<?php

namespace Lib;

/**
 * 读配置文件
 *
 * @package    Tool
 */
class Conf
{

    private static $inst = array();

    private function __construct()
    {

    }

    /**
     * 读取配置文件,支持.模式读下一级,例如 \Lib\Conf::get('database.master')
     * 只支持加一级目录
     *
     * @param string $key
     * @param string $default
     * @return array|mixed|null
     */
    public static function get($key, $default = null)
    {
        if (strpos($key, '.') !== false) {
            list($file, $path) = explode('.', $key, 2);
        } else {
            $file = $key;
        }

        if (file_exists(APP_PATH . '/' . App_Name . '/Conf/' . $file . '.php')) {
            self::$inst[$file] = include(APP_PATH . '/' . App_Name . '/Conf/' . $file . '.php');
        } elseif (file_exists(SERVICE_PATH . '/Conf/' . $file . '.php')) {
            self::$inst[$file] = include(SERVICE_PATH . '/Conf/' . $file . '.php');
        }
        if (!isset($path)) {
            return self::$inst[$file];
        }

        /**
         * 注意：get()方法不能获取key为数字的对象，此处用path方法替换
         */
        return self::path(self::$inst[$file], $path, $default);
    }

    public static function path($array, $path, $default = null)
    {
        if ($path && array_key_exists($path, $array)) {
            return $array[$path];
        }

        $delimiter = ".";
        $keys      = explode($delimiter, $path);
        do {
            $key = array_shift($keys);

            if (isset($array[$key])) {
                if ($keys) {
                    if (is_array($array[$key])) {
                        $array = $array[$key];
                    } else {
                        break;
                    }
                } else {
                    return $array[$key];
                }
            } elseif ($key === '*') {
                $values    = array();
                $innerPath = implode($delimiter, $keys);
                foreach ($array as $arr) {
                    $value = is_array($arr) ? self::path($arr, $innerPath) : $arr;
                    if ($value) {
                        $values[] = $value;
                    }
                }

                if ($values) {
                    return $values;
                } else {
                    break;
                }
            } else {
                break;
            }
        } while ($keys);

        return $default;
    }

}
